##Teste G de aderncia estatstica

Teste.G <- function(x, pe=1)
		{
		if(pe==1) #Se as frequncias esperadas sero calculadas a partir de um vetor de razes ou propores derivado dos dados observados
			    #Neste caso, todas as categorias tm a mesma probabilidade de ocorrer
			{
			p.esperada <- 1/(length(x[,2])) #Divide 1, que es a mxima probabilidade, entre o nmero de categorias de observaes
			x$p.esperadas <- rep(p.esperada, times=length(x[,2])) #Repete a probabilidade de ocorrncia tantas vezes quanto o nmero de categorias
												#de observaes, e cria a coluna de propores esperadas dentro da tabela
			x$f.esperadas <- x$p.esperadas*sum(x[,2]) #Cria a coluna de frequncias esperadas multiplicando cada fila da coluna de propores esperadas
										#por o nmero total de observaes
			}

		if(pe==2) #Se o dataframe contem uma terceira coluna de propores esperadas, derivada 'a priori' de alguma expectativa terica
			{
			x$f.esperadas <- ((x[,3])/(sum(x[,3])))*(sum(x[,2])) #Cria a coluna de frequncias esperadas dividindo cada fila da coluna de propores
											     #esperadas entre o valor total da mesma coluna e multiplicando depois pelo nmero 
											     #total de observaes
			}
		
		if(length(x[,3])!=length(x[,1])) stop("O vetor de propores no tem o mesmo tamanho do nmero de categoria dos dados") #A funo pra 
		#se os vetores de propores esperadas e de categorias dos dados no tm o mesmo tamanho

		if(length(x[,1])==2) #Se o nmero de categorias de observaes so somente duas, ento a funo faz a correo de continuidade do Yates
			{
			if(x[1,2]>x[1,4]) #Se a primeira frequncia observada  maior do que a primeira frequncia esperada
				{
				x$yates.correction[1] <- x[1,2] - 0.5 #Subtrai-se 0.5 para a primeira frequncia observada e coloca o resultado na primeira
										  #fila de uma nova coluna chamada de yates.correction
				}
			if(x[1,2]<=x[1,4]) #Se a primeira frequncia observada  menor ou igual do que a primeira frequncia esperada
				{
				x$yates.correction[1] <- x[1,2] + 0.5 #Suma-se 0.5 para a primeira frequncia observada e coloca o resultado na primeira
									  	  #fila da coluna yates.correction
				}
			if(x[2,2]>x[2,4]) #Se a segunda frequncia observada  maior do que a segunda frequncia esperada
				{
				x$yates.correction[2] <- x[2,2] - 0.5 #Subtrai-se 0.5 para a segunda frequncia observada e coloca o resultado na segunda
										  #fila da coluna yates.correction
				}
			if(x[2,2]<=x[2,4]) #Se a segunda frequncia observada  menor ou igual do que a segunda frequncia esperada
				{
				x$yates.correction[2] <- x[2,2] + 0.5 #Suma-se 0.5 para a segunda frequncia observada e coloca o resultado na segunda
									        #fila da coluna yates.correction
				}
			x$taxa <- x$yates.correction/x$f.esperadas #Calcula-se a taxa das frequncias para cada categoria. Neste caso, divide-se cada 
										 #frequncia corrigida pelo Yates entre cada frequncia esperada, e coloca-se o 
										 #resultado numa nova coluna chamada de taxa
			x$obs.log.taxa <- (x$yates.correction)*(log(x$taxa)) #Calcula-se o logaritmo natural (base e) para cada taxa corrigida e multiplica-se
											     #por cada frequncia corrigida pelo Yates. O resultado  colocado numa nova coluna
											     #chamada de obs.log.taxa
			}
		
		if(length(x[,2])>2) #Se o nmero de categorias de observaes so mais do que duas
			{
			x$taxa <- x[,2]/x[,4] #Calcula-se a taxa das frequncias para cada categoria. Neste caso, divide-se cada frequncia observada						    #entre cada frequncia esperada, e coloca-se o resultado
						    #numa nova coluna chamada de taxa
			x$obs.log.taxa <- (x[,2])*(log(x$taxa)) #Calcula-se o logaritmo natural (base e) para cada taxa e multiplica-se por cada frequncia
									    #observada. O resultado  colocado numa nova coluna chamada de obs.log.taxa
			}

		G <- (2)*(sum(x$obs.log.taxa)) #Calcula-se o valor do estimador G a partir da somatria da coluna obs.log.taxa multiplicada por 2
		df <- (length(x[,1]))-1 #Calcula-se o valor dos graus de liberdade (df = n-1, onde n = nmero de categorias da varivel)
		valor.p <- pchisq(G,df, lower.tail=F) #Calcula-se o valor p de significncia estatstica comparando o valor do estimador G com graus de liberdade 
								  #df numa distribuio qui-quadrado

		resultado <- list(Tabela=x, G=G, valor.p=valor.p) #Cria uma lista com a tabela completa de todos os clculos, o valor do estimador G e o valor p 
										  #de significncia estatstica do teste
										
		return(resultado)
		}




